package demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
    /*
        Person需要使用Shirt时，Spring中的操作应当是将其定义为属性
        并添加@Autowired注解，Spring容器在初始化Person时就会将Shirt对象通过这个属性将其"注入"进来，从而
        组件Person与Shirt的依赖关系，这个操作也被称为"依赖注入"
        需要注意，被注入的对象也要在Spring容器中被管理。这个案例中Shirt也需要@Component注解
     */
//    @Autowired
//    private Shirt shirt;

//    @Autowired
//    private Sweater sweater;

    /*
        当我们依赖一个接口时，Spring在进行自动装配时会寻找其内部管理的类中有没有实现该接口的，如果存在
        则将其注入进来。
     */
    @Autowired
    @Qualifier("winter")
    private Clothes clothes;//依赖接口

    public void play(){
        /*
            当我们在一个类的某个方法中调用了另一个类的方法来实现部分逻辑时，此时这两个类之间就存在了依赖关系。
            比如:
            Person的play方法中，使用了Shirt的wear方法来完成部分逻辑，此时Person就与Shirt存在依赖关系
            正常编码建立依赖:
            实例化，并调用对方的方法
            Shirt shirt = new Shirt();
            shirt.wear();

            Spring容器，建立IOC思想，我们需要使用一个类时不要自行解决实例化以及初始化的操作，应当让Spring容器
            去管理。
            当我们需要使用其他类时，应当:
            1:在当前类上定义该类的属性
            2:在该属性上添加一个注解:@Autowired(自动装配)，由String容器负责装配
              此时Spring容器会寻找该类的实例并设置到这个属性上

         */
        //穿上衣服出去玩耍
//        Shirt shirt = new Shirt();
//        shirt.wear();
//        sweater.wear();
        clothes.wear();
        System.out.println("出门玩耍");
    }
}
